package net.zdsoft.wpchat.android.util;

import java.util.Enumeration;
import java.util.Map;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;

import net.zdsoft.keel.util.SecurityUtils;

/**
 * 安全工具类-校验客户端过来的请求
 * 
 * @author xuan
 * @version $Revision: 1.0 $, $Date: 2014-9-22 下午10:38:49 $
 */
public abstract class SecuryUtils {
    /**
     * 对http参数生成验证码，返回参数校验后的MD5值，过滤掉带fileItem*格式的字段，文件
     * 
     * @param httpParamsMap
     * @param md5Key
     *            一般是accountId
     * @return
     */
    public static String getHttpParamsSecuryKey(Map<String, String> paramMap, String md5Key) {
        if (null == paramMap || paramMap.isEmpty()) {
            return "";
        }

        paramMap.remove("securyKey");
        TreeMap<String, String> map = new TreeMap<String, String>(paramMap);// 排序

        // 拼接参数
        StringBuilder str = new StringBuilder();
        for (Map.Entry<String, String> e : map.entrySet()) {
            str.append(e.getKey()).append("=").append(e.getValue()).append("&");
        }

        if (!paramMap.isEmpty()) {
            str.deleteCharAt(str.length() - 1);
        }
        str.append(md5Key);

        // MD5返回
        return SecurityUtils.encodeByMD5(str.toString());
    }

    /**
     * 对http参数生成验证码，返回参数校验后的MD5值
     * 
     * @param httpParamsMap
     * @param md5Key
     *            一般是accountId
     * @return
     */
    public static String getHttpParamsSecuryKey(HttpServletRequest request, String md5Key) {

        // 对请求参数进行Tree排序，并剔除securyKey
        TreeMap<String, Object> map = new TreeMap<String, Object>();
        Enumeration<String> en = request.getParameterNames();
        while (en.hasMoreElements()) {
            String key = en.nextElement();
            map.put(key, request.getParameter(key));
        }
        map.remove("securyKey");

        // 拼接参数
        StringBuilder str = new StringBuilder();
        for (Map.Entry<String, Object> e : map.entrySet()) {
            str.append(e.getKey()).append("=").append(e.getValue()).append("&");
        }

        if (!map.isEmpty()) {
            str.deleteCharAt(str.length() - 1);
        }
        str.append(md5Key);

        // MD5返回
        return SecurityUtils.encodeByMD5(str.toString());
    }

    /**
     * 校验客户端传来的参数
     * 
     * @param request
     * @param md5Key
     * @return
     */
    public static boolean isHttpParamValid(HttpServletRequest request, String md5Key) {
        String securyKey = request.getParameter("securyKey");
        return StringUtils.equals(securyKey, getHttpParamsSecuryKey(request, md5Key));
    }

    /**
     * 校验客户端传来的参数，文件上传接口可用
     * 
     * @param request
     * @param md5Key
     * @param securyKey
     * @return
     */
    public static boolean isHttpParamValid(Map<String, String> paramMap, String md5Key) {
        String securyKey = paramMap.get("securyKey");
        return StringUtils.equals(securyKey, getHttpParamsSecuryKey(paramMap, md5Key));
    }

    /**
     * 用户注册调用万朋学堂校验码（ 约定字符串＋时间戳（格式为1970年1月1日0时0分0秒至今的毫秒数）进行MD5得到后+时间戳明文）
     * 
     * @param time
     * @param md5Key
     * @return
     */
    public static String getRegisterUserSecuryKey(long time, String md5Key) {
        // 拼接参数
        StringBuilder str = new StringBuilder();
        str.append(md5Key);
        str.append(time);
        // MD5返回
        return SecurityUtils.encodeByMD5(str.toString()) + time;
    }

}
